unit ListaPrzedmiotow;

interface

uses Narzedzia, ListaOcen;

procedure dodaj_przedmiot(var head : wprzedmioty; nazwa : string);
function licz_przedmioty(head : wprzedmioty) : integer;
procedure usun_przedmioty(var head: wprzedmioty);
function szukaj_przedmiot(head : wprzedmioty; nazwa:string) : wprzedmioty;
procedure usun_przedmiot(var head: wprzedmioty; przedmiot_do_kas: wprzedmioty);

implementation

{---------------------------------}
{ Operacje na liscie przedmiotow  }
{---------------------------------}

{ procedura dodaje przedmiot do listy }
procedure dodaj_przedmiot(var head : wprzedmioty; nazwa : string);
var
   p : wprzedmioty;
begin
      new(p);
      p^.nazwa := nazwa;
      p^.oceny := nil;
      p^.nastepny_przedmiot := head;
      head := p;
end;

{ funkcja licząca ilosc przedmiotow }
function licz_przedmioty(head : wprzedmioty) : integer;
var
  c : integer;
begin
  c := 0;
  while head <> nil do begin
    inc(c);
    head := head^.nastepny_przedmiot;
  end;
  licz_przedmioty := c;
end;

{ procedura usuwa przedmioty      }
procedure usun_przedmioty(var head: wprzedmioty);
var
    aktualny: wprzedmioty;
begin
    aktualny := head;
    while aktualny <> nil  do begin
          aktualny := aktualny^.nastepny_przedmiot;
          { ! usuwamy oceny ! }
          usun_oceny(head^.oceny);
          dispose(head);
          head := aktualny;
    end;
    head := nil;
end;

{ funkcja sprawdzjaca czy podany przedmiot istnieje - jesli tak zwraca przedmiot, nie - nil`a }
function szukaj_przedmiot(head : wprzedmioty; nazwa:string) : wprzedmioty;
var
     aktualny : wprzedmioty;
     jest : boolean;
begin
 aktualny := head;

  while aktualny <> nil do begin
      if (aktualny^.nazwa = nazwa)  then begin
         jest:=true;
         break;
      end;

  aktualny:=aktualny^.nastepny_przedmiot;
  end;

  if jest then szukaj_przedmiot := aktualny else szukaj_przedmiot := nil;

end;

{ procedura usuwa z listu jeden konrketny przedmiot }
procedure usun_przedmiot(var head: wprzedmioty; przedmiot_do_kas: wprzedmioty);
var
     poprzedni, aktualny: wprzedmioty;
begin
  aktualny := head;
  while(aktualny <> nil) do begin

    { jesli nazwy pasuja do siebie mozemy usuwac }
    if(aktualny^.nazwa = przedmiot_do_kas^.nazwa) then begin
            { przypadek 1 - usuwamy glowe }
            if(aktualny = head) then begin

                   head := aktualny^.nastepny_przedmiot;

                   { usuwamy oceny }
                   usun_oceny(aktualny^.oceny);

                   { usuwamy nas }
                   dispose(aktualny);

                   { dla bezpiecznstwa }
                   aktualny := nil;

                   { dalej nie musimy iterować }
                   exit;

            end
            { normlane usuwanie }
            else begin

                   poprzedni^.nastepny_przedmiot := aktualny^.nastepny_przedmiot;

                   { usuwamy oceny }
                   usun_oceny(aktualny^.oceny);

                   { usuwamy nas }
                   dispose(aktualny);

                   { dla bezpiecznstwa }
                   aktualny := nil;

                   { dalej nie musimy iterować }
                   exit;
            end;
    end
    { skaczemy dalej }
    else begin
         poprzedni := aktualny;
         aktualny := aktualny^.nastepny_przedmiot;
    end;
  end;
end;

end.

